#include "gtest/gtest.h"
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include "log_api.h"

void print_backtrace() {
    const int max_frames = 128;
    void* buffer[max_frames];

    // 获取当前调用栈的地址信息
    int frame_count = backtrace(buffer, max_frames);

    // 将地址信息转化为字符串
    char** symbols = backtrace_symbols(buffer, frame_count);

    // 打印每一帧信息
    if (symbols != nullptr) {
        printf("Backtrace (most recent call first):\n");
        for (int i = 0; i < frame_count; ++i) {
            printf("%s\n", symbols[i]);
        }
        free(symbols);  // 释放符号表
    } else {
        printf("Error: Unable to obtain backtrace symbols.\n");
    }
}

void signal_handler(int signum) {
    printf("Caught signal %d\n", signum);
    print_backtrace();
    exit(signum);
}

void log_callback_cb(const char *log_buf, uint32_t log_len)
{
    write(STDOUT_FILENO, log_buf, log_len);
}

int main(int argc, char **argv)
{
    signal(SIGSEGV, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）
    signal(SIGABRT, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）
    signal(SIGFPE, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）
    signal(SIGTERM, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）
    signal(SIGTRAP, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）
    signal(SIGPIPE, signal_handler);  // 捕获 SIGSEGV（例如访问空指针）

    log_early_init(log_callback_cb);
    log_init(NULL);

    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}